package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常--标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误，有解决方案
 *               编译期：RunTimeException异常表示类
 *                     FileOutputStream创建对象--波浪线--抛出出到方法之外
 *               检查异常：通常都是编译器检查处理，长须直接报错，抛出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常--抛出方法之外--打印控制台
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台直接输出异常对象名称，RunTimeException异常表示类
 *               最后了解【throw与throws--RunTimeException】
 * Error错误：描述系统级别的错误，一旦出现，程序一定宕机，无解决方案。
 *          出现概率：非常低-->递归问题-->
 *
 * @author 王培贤
 */
public class EE {
    /**
     * Error  错误---程序有严重错误
     * 模拟：方法调方法--栈溢出错误
     *StackOverflowError 栈溢出错误
     *
     public static void method(){
     method();
     }
     @Test public void testError(){
     EE.method();
     }
     */
    /**
     * Exception异常：检查异常【出现在编译期】--代码报波浪线
     * 两种解决方案：①捕获异常（*）
     * 语法：try{
     * 怀疑代码可能有异常或者提示异常
     * }catch(小异常名字 e){
     * e.printStacktrace(); 打印异常信息
     * }catch(中异常名字 e){
     * e.printStacktrace(); 打印异常信息
     * }catch(大异常名字 e){   Exception
     * e.printStacktrace(); 打印异常信息
     * }finally{
     * 一定执行代码块
     * }
     * 这个不用手写 选中用CTRL+ALT+T快捷键能调出来
     * <p>
     * ②抛出异常   throws 异常名字
     * 考试题：throw与throws的区别
     * 异常关键字：throw
     * throws
     * 非检查异常【出现运行期--代码无错误--控制台
     * ---------------------
     * 异常：FileNotFoundException   文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常：NullPointerException    空指针异常
     * 产生原因：字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutOfBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException   数字转换异常
     * 产生原因字符串不是正确类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现在编译期】--代码报波浪线
        //FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】--控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str); //解析字符串--转换为对应类型
        } catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace();//打印异常对象信息
            System.out.println("字符串小异常：下标越界异常~~");
        } catch (NumberFormatException e) {
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常~~");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("大异常");
        } finally {
            System.out.println("一定执行的代码块");
        }
    }

    /**
     * 作业1：再写出5个非检查异常的代码实例
     * 提示：查API--java.lang.异常
     * 字符串、包装类、集合、IO流 都有异常
     */
    @Test
    public void testHomeWork1() {
//        ①ArithmeticException异常：抛出异常算术条件时抛出。 例如，“除以零”的整数会抛出此类的一个实例。
//        int test0=10/0;
//        System.out.println(test0);
//        ②ClassCastException异常：抛出表示代码尝试将对象转换为不属于实例的子类。
//        Object x = new Integer(0);
//        System.out.println((String)x);
//        ③NegativeArraySizeException异常：抛出一个应用程序尝试创建一个负数大小的数组。
//        int test1=-10;
//        int [] Array=new int[test1];
//        ④ArrayIndexOutOfBoundsException异常：抛出以表示使用非法索引访问数组。
//        索引为负数或大于或等于数组的大小。
//        int[] arr = {1, 2, 3};
//        for (int i = 0; i <= arr.length; i++) {
//            System.out.println(arr[i]);
//        }
//        ⑤UnsupportedEncodingException异常：字符编码不支持。
//          byte[] test3=toGBK("中文");
//        System.out.println(Arrays.toString(test3));
//    }
//    static byte[] toGBK(String s){
//        return s.getBytes("GBK");
    }
    /**
     * finally与final区别：
     * final【最终】 修饰类：不可改变类 | 修饰属性：不可改变值【常量】 |  修饰方法：方法不可以重写，可以重载
     * finally处理异常块：关闭流
     */
}
